// use std::iter::Iterator as OtherIterator;

/// 1. 迭代器负责遍历序列中的每一项和决定序列合适结束的逻辑
/// 2. 创建迭代器：迭代器是惰性的，意思是在调用方法使用迭代器之前，不会有任何效果
/// 3. 每个迭代器实现了iterator trait, 定义中标准库中的

// trait Iterator {
//     type Item;
//     // next 是Iterator被要求实现的唯一的一个方法，next一次返回一个元素，当迭代器结束的时候，返回None
//     fn next(self) -> Option<Self::Item>; //type Item和Self::Item这种用法叫做定义trait的关联类型
// }
fn main() {
    let v1 = vec![1, 2, 4, 5];
    let mut v1_iter = v1.iter(); // 到目前为止，不会对v1产生任何影响
    // for val in v1_iter {
    //     println!("val = {}", val);
    // }
    if let Some(v) = v1_iter.next() {
        println!("v = {}", v)
    } if let Some(v) = v1_iter.next() {
        println!("v = {}", v)
    } if let Some(v) = v1_iter.next() {
        println!("v = {}", v)
    } if let Some(v) = v1_iter.next() {
        println!("v = {}", v)
    } else {
        println!("At end")
    }
    println!("++++++++++++++++++++++++++++++++++++++");
    // 迭代可变引用
    let mut v3 = vec![1, 2, 3];
    // 使用 iter_mut() 获取可变引用的迭代器
    let mut v3_iter = v3.iter_mut();
    // 获取第一个元素并修改其值
    if let Some(v) = v3_iter.next() {
        // 迭代器是一个引用，要使用值需要将v进行解引用，*v
        *v = 3;
    };
    if let Some(v) = v3_iter.next() {
        // 迭代器是一个引用，要使用值需要将v进行解引用，*v
        *v = 3;
    };
    println!("迭代可变引用iter_mut = {:?}", v3);

    // 消费适配器
    let v4 = vec![1, 2, 3, 4];
    let v4_iter = v4.iter();
    let total: i32 = v4_iter.sum(); // 调用消费适配器sum来求和, 这里还必须传入类型，否则会报错
    println!("消费适配器 = {}", total);

    // 迭代适配器
    let v5 = vec![5, 6, 7, 8];
    let v5_iter: Vec<_> = v5.iter().map(|x| x + 1).collect();
    println!("迭代适配器 = {:?}",v5_iter);

    // 比较迭代器
    let v6 = vec![5, 6, 7, 8];
    let v6_iter: Vec<_> = v6.into_iter().filter(|x| *x > 6).collect();
    println!("v6_iter = {:?}", v6_iter);
    println!("Hello, world!");
}
